%\DeclareGraphicsExtensions{.pdf,.png,.jpg,.gif}
\documentclass{classrep}

\usepackage[utf8]{inputenc}
\usepackage{color}

\usepackage[ragged]{nolbreaks}
\sloppy
\usepackage{float}
\usepackage{hyperref}
\usepackage{listings}
\usepackage{amsmath}
\usepackage{listings}
\usepackage{graphicx}

\studycycle{Informatyka, studia dzienne, inż. I st.}
\coursesemester{VI}

\coursename{Podstawy Kryptografii - laboratorium}
\courseyear{2010/2011}

\courseteacher{prof. dr hab. Włodzimierz Jemec}
\coursegroup{poniedziałek, 08:30}

\author{%
  \studentinfo{Marcin Piekarski}{150972} \and
  \studentinfo{Kamil Stasiak}{143099}    \and
  \studentinfo{Michał Mela}{150940} \and
  \studentinfo{Michał Kamiński}{150897}
}

\title{Zadanie 1: Protokół ślepych podpisów cyfrowych w oparciu o algorytm RSA}

\begin{document}
\maketitle

\section{Cel}
Celem zadania było napisanie protokołu ślepych podpisów cyfrowych w oprarciu o
algorytm RSA. Ponaddto stworzenie aplikacji, która wysyła dokument do podpisu
otrzymuje podpisany dokument i sprawdza poprawność podpisu.

\section{Opis algorytmu RSA}
Algorytm $RSA$ jest algorytmem szyfracji danych asymetrycznie. Nazwa
algotytmu pochodzi od jego autorów Rivesta, Shamira i Adlemana.
Opiera się o parę kluczy tzw. klucz publiczny i klucz prywatny.
Ważną własnościa algorytmu RSA jest przemienność:
Jeżeli ${K_1}$ i ${K_2}$ są kluczami to dla dowolnej wiadomości ${m}$ zachodzi:  
\begin{equation}
\label{eqn:wzor1}
 D_{K_1}({E_{K_2}}(m)) = m 
\end{equation}
\begin{equation}
\label{eqn:wzor2}
 D_{K_2}(E_{K_1}(m)) = m 
\end{equation}

\subsection{Generowanie kluczy RSA}
Wybieramy losowo dwie duże liczby pierwsze ${p}$ i ${q}$
Obliczamy 
\begin{equation}
\label{eqn:wzor3}
 n=pq 
\end{equation}
Wyznaczamy funkcję Eulera 
\begin{equation}
\label{eqn:wzor4}
 \varphi(n)=(p-1)(q-1)
\end{equation}
Losujemy liczbę ${e}$ z przedziału (0,${\varphi(n)}$), względnie pierwszą z
${\varphi(n)}$.\newline
Znajdujemy liczbę d odwrotną do ${e \mod \varphi(n)}$
\begin{equation}
\label{eqn:wzor5}
 d \equiv e^{-1} \mod{\varphi(n)}
\end{equation}
Kluczem publicznym jest para ${(e,n)}$ natomaiast klucze prywatnym jest ${(d,n)}$.

\subsection{Szyfrowanie i deszyfrowanie}
Wiadomość ${m}$ dzielona jest na bloki ${m_i}$ przy czym ${m_i}$ jest nie
większe niż ${n}$. Każdy z bloków szyfrowany jest kluczem publicznym według
wzoru
\begin{equation}
\label{eqn:wzor6}
 c_i = {m_i}^e
\end{equation}
Deszyfrowanie polega na podobnej operacji z użyciem klucza prywatnego.
\begin{equation}
\label{eqn:wzor7}
 m_i = {c_i}^d
\end{equation}
Zgodnie ze wzorem \ref{eqn:wzor1} Możemy dokonać szyfracji i deszyfracji
używając kluczy w odwrotnej kolejności.

\section{Podpis cyfrowy}
Podpis cyfrowy jest matematycznym potwierdzeniem autentyczności dokumentu. Jest
on odpowiednikiem tradycyjnego podpsiu, jaki składamy na dokumentach. Idealnym
algorytmem do tworzenia podpisów cyfrowych jest wcześniej wspomniany algorytm
RSA. Autor wiadomości szyfruje ją kluczem prywatnym. 
Odbiorca wiadomośći otrzymując ją jest w stanie odszyfrować ją kluczem publicznym 
i sprawdzić autentyczność wiadomości. Rozwiązanie takie ma zasadniczą wadę, 
gdyż podpis jest nie krótszy niż sama wiadomość. Najczęściej stosowane są
jednokierunkowe funkcje hashujące. Autor wiadomości szyfruje wartość funkcji
hashującej i przesyła ją razem z dokumentem. Odbiorca oblicza wartość funkcji
hashującej i porównuje z odkodowaną wartością.

\section{Ślepy podpis cyfrowy}
Ślepy podpis cyfrowy jest formą podpisu cyfrowego w którym osoba podpisująca nie
zna podpisywanego dokumentu. Autor wiadomości i osoba podpisująca to de facto
dwie różne osoby. Do generowania ślepych podpisów wyjątkowo dobrze nadaje się
algorytm RSA.

\subsection{Tworzenie ślepego podpisu cyfrowego}
Autor wiadomości najpierw pobiera klucz publiczny (e,n) osoby podpisującej
wiadomość. Następnie zakrywa wiadomość ${m}$ poprzez losową liczbę ${r}$. Liczba
ta musi być względnie pierwsza z n.
\begin{equation}
\label{eqn:wzor8}
m' \equiv mr^e \mod{n}
\end{equation}
Tak zakodowaną wiadomość przesyła do osoby podpisującej, która tworzy ślepy
podpis. 
\begin{equation}
\label{eqn:wzor9}
s' \equiv {m'}^d \mod{n}
\end{equation}
Ślepy podpis przesyłany jest do autora wiadmości, który usuwa czynnik
zaślepiający. 
\begin{equation}
\label{eqn:wzor10}
s \equiv {s'}{r}^{-1} \mod{n}
\end{equation}
Przy czym ${s}$ jest podpisem wiadomości i ponad to
\begin{equation}
\label{eqn:wzor11}
s \equiv {m}^d \mod{n} 
\end{equation}

\section{Architektura aplikacji}
W celu stworzenia protokołu ślepego podpisu cyfrowego stworzyliśmy dwie
aplikacje. Jedną z nich jest apikacją webową służącą do tworzenia podpisu, drugą
natomiast jest aplikacją desktopową będąca klientem usługi ślepych podpisów
cyfrowych. Aplikacja webowa jest internetową usługą opartą o protokuł SOAP.
Aplikacja napisana jest w technologii J2EE, oparta o kontekst spring i
klasę DispatcherMessage udostępnioną przez bibliotekę spirng-ws. Klasa SigningServiceEndpoint jest
klasą której interfejs jest wystawiany na zewnątrz aplikacji. Udostępiająca
klucz publiczny, a także możliwość podpisania wiadomości. Każda z tych operacji
jest symetryczna. Klucz, a także wiadomości przesyłane są w postaci liczby
całkowitych. Skorzystaliśmy tutaj z klasy BigInteger pozwalającej na przesyłanie dowolnie dużych liczb.
Klasą która generuje klucze publiczne i prywatne, a także podpisuje wiadomości
jest klasa RSASigner. Jest ona singletonem, istnieje jedyna instancja, dlatego
też za każdym razem klucze są takie same. Podpisywanie wiadomości polega na
podniesieniu wiadomości do potęgi wartości klucza prywatnego, zgodnie ze wzorem
\ref{eqn:wzor9}.\newline
Aplikacja BlindSignClient jest aplikacją klienta powyżej wymienionej usługi
internetowej. Oparta jest również o kontekst spring i korzysta z klienta web
service udostępnionego przez bibliotekę spring. Może pracować w dwuch trybach.
Jednym z nich to przesłanie do podpisu całego pliku bądź wiadomości. Drugim
trybem jest przesłanie do podpisania skrótu wiadomości, korzystając z funkcji
hashującej SHA-2. Przygotowuje ona wiadomość do przesłania szyfrując ją losową
liczbą $r$ zgodnie ze wzorem \ref{eqn:wzor8} a także usuwa czynnik zaślepiający zgodnie ze
wzorem \ref{eqn:wzor10}.
\begin{figure}[H]
  \centering
  \includegraphics[width=\textwidth]{SingtureServiceClass}
  \caption[Diagram klas]%
  \label{Diagram klas aplikacji SigningService}
\end{figure}
\begin{figure}[H]
  \centering
  \includegraphics[width=\textwidth]{SignatureClient.jpg}
  \caption[Diagram klas2]%
  \label{Diagram klas aplikacji BlindSingatureClient}
\end{figure}
\begin{figure}[H]
  \centering
  \includegraphics[width=\textwidth]{Sequence.jpg}
  \caption[Diagram sekwencji]%
  \label{Diagram sekwencji}
\end{figure}
\clearpage

\section{Opis użycia aplikacji}
Aplikacja SigningService jest przystosowana do każdego rodzaju serwerów webowych
wspierających technologię J2EE. W czasie testowania korzystaliśmy z kontenera
webowego Tomcat 7.0.26. Aplikacja desktopowa przystosowana jest na każdy
komputer posiadający maszynę wirtualną Javy. 
Zadaniem aplikacji desktopowej jest stworzenie podpisu pod wiadomością, dlatego
możliwe jest wczytanie dowolnego pliku, jak także wpisanie wiadomości do
aplikacji. Aplikacja daje możliwość wysłania do podpisu całej wiadomości jak i
skrótu. Domyślnie podpisuje całą wiadomość. Jeżeli chcemy podpisać skrót należy
zaznaczyć taką opcję. Dodatkową możliwością jest spradzenie poprawności podpisu. 
Jeżeli podpis odkodujemy kluczem publicznym, to zgodnie ze wzorem
\ref{eqn:wzor11} otrzymamy wiadomość.
\begin{figure}[H]
  \centering
  \includegraphics[width=\textwidth]{UseCase.jpg}
  \caption[Diagram sekwencji]%
  \label{Diagram przypadków użycia}
\end{figure}

\begin{thebibliography}{plain}
\bibitem{1} Notatki wykładowe
\bibitem{2} Kutylowski M., Strothmann W.B., \textsl{Kryptografia, Teoria i
Praktyka, Zabezpieczanie systemów komputerowych}, Warszawa 1998, Wyd. LUPUS
\bibitem{3} \textit{ http://www.prz.rzeszow.pl/pl/zsr/pliki/bezpieczenstwo\_wyklady/konspekt\_boi\_03.pdf }
\end{thebibliography}

\end{document}
